我來把準備畫面跟遊戲分開好了
這樣比較不會什麼都塞在同一個 liveview
先來改 router 部分
live "/:id/host", GameLive.Invite, :host
live "/:id/guest", GameLive.Invite, :guest
我把原本的邀請畫面的路徑多加一個 /invite
live "/:id/host/invite", GameLive.Invite, :host
live "/:id/guest/invite", GameLive.Invite, :guest
live "/:id/host", GameLive.Game, :host
live "/:id/guest", GameLive.Game, :guest
當他們都按下確認後就跳到 Game 這個 liveview
我們來多加一個條件到 handle_info
def handle_info(
%{host_ready: true, guest_ready: true} = room,
%{assigns: %{player: player}} = socket
) do
socket =
socket
|> assign(:room, room)
|> then(&push_redirect(&1, to: Routes.game_game_path(&1, player, room.id)))
{:noreply, socket}
end
def handle_info(room, socket) do
{:noreply, assign(socket, :room, room)}
end
如果 room 裡面雙方都準備好的話
就會對到第一個 handle_info
,幫他們用 push_redirect
來轉到新的地方
先建立一個空白的頁面確定他們準備好之後都過的來
新增 lib/card_web/live/game_live/game.ex
defmodule CardWeb.GameLive.Game do
use CardWeb, :live_view
import CardWeb.Component
def render(assigns) do
~H"""
<div class="flex flex-col items-center h-screen">
<.logo />
</div>
"""
end
end
現在應該雙方準備好之後都會到這個只有 logo 的頁面了
明天來把他跟遊戲串起來